// mystdio.h
#pragma once // 这是一个编译器指令，用于确保头文件只被编译一次，避免重复包含的错误。

#include <stdio.h> // 包含了标准的输入输出库。这里可能主要是为了使用 NULL 定义，或者在某些编译器环境下提供 size_t 等类型。

// -- 宏定义 --
#define SIZE 4096 // 定义缓冲区的大小。这意味着我们的输出缓冲区一次最多可以存储 4096 字节的数据。

// 定义不同的刷新模式的标志位。使用位移操作 (1 << n) 可以确保每个标志位占用一个不同的比特位，方便使用位运算组合或检查多种模式。
#define NONE_FLUSH (1<<1) // 不进行自动刷新，需要手动调用 fflush (虽然代码中似乎没有完全实现这个模式的逻辑)。
#define LINE_FLUSH (1<<2) // 行缓冲模式。当遇到换行符 '\n' 时进行刷新。这是标准输出 stdout 和标准错误 stderr 在连接到终端时的默认模式。
#define FULL_FLUSH (1<<3) // 全缓冲模式。当缓冲区满时进行刷新。这是标准输出 stdout 在重定向到文件时的默认模式。

// -- 自定义文件流结构体 --
// 使用 typedef struct { ... } Name; 的形式定义一个结构体类型，并给它一个别名 myFILE。
// 这个结构体用来表示一个自定义的文件流对象，类似于标准 C 库中的 FILE 结构体。
typedef struct _myFILE // _myFILE 是结构体的标签名，myFILE 是类型别名
{
    //char inbuffer[]; // 注释掉的部分，可能预留用于输入缓冲区的实现。

    char outbuffer[SIZE]; // 输出缓冲区。这是一个固定大小的字符数组，用于暂时存储要写入文件的数据。数据会先写入到这里，满足一定条件时再批量写入到底层文件。

    int pos; // 缓冲区中当前已存储的数据的末尾位置。它表示 outbuffer 中有多少字节的数据是有效的，并且等待被写入文件。初始值为 0。

    int cap; // 缓冲区的总容量。理论上应该等于 SIZE (4096)。在结构体中存储这个值方便使用，尽管在这个实现中它的值是固定的。

    int fileno; // 底层的文件描述符 (File Descriptor)。这是一个整数，代表操作系统打开的文件。这是我们的自定义文件流与操作系统内核交互，进行实际文件读写操作的句柄。通过 open() 系统调用获取。

    int flush_mode; // 刷新模式。存储上面定义的 NONE_FLUSH, LINE_FLUSH, FULL_FLUSH 等标志位，决定何时自动将缓冲区中的数据写入文件。

} myFILE; // 这是使用 typedef 定义的结构体类型别名。

// -- 函数声明 (公共接口) --
// 这些是我们的自定义库提供给外部使用的函数。

myFILE* my_fopen(const char* pathname,const char*mode);
int my_fwrite(myFILE* fp,const char* s,int size);
void my_fflush(myFILE* fp);
void my_fclose(myFILE* fp);
void DebugPrint(myFILE* fp);
